# 数据类型：数字

## 数字常量

### 整数：理论上整数无穷大，没有限制其长度
print(2**100) #输出2的100次方

# 二进制 0b或0B开头
0b101
0B100
# 八进制 0o或者0O开头
# 十六进制 0x或者0X开头

# 进制仅仅是书写方式不同，系统内容仍然按照十进制处理，并且生成一个整数对象

# 字符串按照进制转换为一个整数对象：
int(111)    #默认十进制
int("10011",2)

# 转换为二进制，八进制，十六进制的字符串
bin(50)
oct(50)
hex(50)

### 浮点数常量

12.5
1.23e+10    #12300000000.0
1.23E-10

# 用 type 可以获取当前变量的类型
type(2)     #int
type(2.0)   #float


### 复数常量
complex(2,3)
2+3j

### 布尔类型常量

True
False

type(True)          #bool
True+3              #4
isinstance(True, int) #True是否是int的示例，真
True is 1           #True和1是否是同一个对象，假


## 数字运算

2**3    #幂运算
~5      #按位取反
-5      #取负
1*2     #乘法
3/2     #除法，答案是1.5
3//2    #floor除法，答案是1
3%2     #取余，答案是1
2+3
1-2
3>>2    #向右移位
3<<2    #向左移位
5&4     #按位与
5|4     #按位或
5^4     #按位异或
#比较运算： > < >= <= == !=
#逻辑运算: not and or

# 当有复杂运算的时候，python将类型转换为更复杂的类型进行运算

# 逻辑判断
# 下列都是假： None,False,各种数字0，空内容''、()、[]等，空的映射{}，返回值为0或者False的__bool__()或者__len__()
# 其余全是真

## 小数
0.3+0.3+0.3+0.1     # 并不是1，而是0.9999999999999999

# 所以使用小数对象来满足精度运算
from decimal import Decimal
Decimal('0.3')+Decimal('0.3')+Decimal('0.3')+Decimal('0.1') #记得必须加上引号当作字符串，否则还是按照普通小数算的

import decimal
Decimal("1")/Decimal("3")   #Decimal('0.3333333333333333333333333333')
decimal.getcontext().prec=5 #可设置全局精度
Decimal("1")/Decimal("3")   #Decimal('0.33333')

# 本地修改
with decimal.localcontext() as local:
    local.prec = 10
    print(Decimal("1") / Decimal("3"))
Decimal("1") / Decimal("3")


## 分数
from fractions import Fraction
x = Fraction(2,8)
x+2
x-2
x*2
x/2
print(x)    #print出来是1/4，console出来时Fraction(1, 4)
Fraction.from_float(1.25)   #Fraction(5, 4) 浮点型转分数


## 数学函数
#内置的常用数学函数
abs(-5)
bin(5)
oct(5)
hex(5)

chr(65)     #A,ASCII与整数互换
ord('A')    #65

divmod(9,4) #(2, 1)，返回商和余数
a=5
eval('a*a+1')   #同js的eval

max(2,1,4,5)
min(2,1,4,5)

pow(2,3)
round(1.234)        #1
round(1.234,2)      #1.23
sum({1,2,3,4})      #求和，参数是迭代器

# math函数
import math
math.pi
math.e
math.inf            #浮点数的正无穷大
-math.inf           #浮点数的父无穷大
math.ceil(2.3)      #不小于x的最小整数
math.floor(2.3)     #不大于x的最大整数
math.fabs(-5)       #返回绝对值
math.factorial(5)   #返回阶乘
math.fmod(9,4)      #取余
x=[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
sum(x)              #0.9999999999999999
math.fsum(x)        #1
math.gcd(12,8)      #最大公约数
math.trunc(15.43)   #返回整数部分
math.exp(3)         #e的几次方
math.expm1(3)       #e的几次方减一
